<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
</head>
<body>
    <button id="doit">Do It 3!</button>
	<script type="text/javascript">
		function reqAsPromise(req) {
			return new Promise((resolve, reject) => {
				req.addEventListener("success", event => resolve(event.target.result));
				req.addEventListener("error", event => reject(event.target.error));
			});
		}

		function txnAsPromise(txn) {
			return new Promise((resolve, reject) => {
				txn.addEventListener("complete", resolve);
				txn.addEventListener("abort", reject);
			});
		}

		async function main() {
            try  {

                const openReq = window.indexedDB.open("two-read-write-txn", 1);
                openReq.onupgradeneeded = (ev) => {
                    const db = ev.target.result;
                    const store = db.createObjectStore("test", {keyPath: "id"});
                    store.add({id: 6});
                };
                const db = await reqAsPromise(openReq);
                
                console.log("open txn1");
                const txn1 = db.transaction("test", "readwrite");
                
                const test1 = txn1.objectStore("test");
                console.log("request value1");
                const value1 = await reqAsPromise(test1.get(6));
                console.log("value1", value1);
                value1.previous = 5;
                value1.next = null;

                let txn2, test2, prom2, value2;

                // prevent deadlock
                (async function() {
                    console.log("open txn2");
                    txn2 = db.transaction("test", "readwrite");
                    test2 = txn2.objectStore("test");
                    console.log("request value2");
                    prom2 = reqAsPromise(test2.get(6));
                    value2 = await prom2;
                    console.log("read value2");
                })();
                
                console.log("write value1");
                test1.put(value1);
                await txnAsPromise(txn1);

                await prom2;
                console.log("value2", value2);            
                value2.next = 7;
                console.log("write value2");
                test2.put(value2);
                await txnAsPromise(txn2);

                const txn3 = db.transaction("test", "readonly");
                const value3 = await reqAsPromise(txn3.objectStore("test").get(6));

                alert("done " + JSON.stringify(value3));

            } catch (err) {
                alert(`error ${err.message} ${err.name} ${err.stack}`);
            }
		}
        document.getElementById("doit").addEventListener("click", main);
	</script>
</body>
</html>
